/*
 * Application.java
 *
 *  created: 19.8.2011
 *  charset: UTF-8
 *  license: MIT (X11) (See LICENSE file for full license)
 */
package cz.mp.k3bg;

import cz.mp.k3bg.log.DetailFormatter;
import cz.mp.k3bg.log.LoggerManager;
import cz.mp.util.app.Version;
import cz.mp.util.console.ConsoleCharset;
import java.io.File;
import java.nio.charset.Charset;
import java.nio.charset.IllegalCharsetNameException;
import java.nio.charset.UnsupportedCharsetException;
import java.util.Locale;
import java.util.logging.Logger;


/**
 * Konstanty a základní informace o programu a jeho prostředí.
 * 
 * @author Martin Pokorný
 * @version 0.1
 */
public class Application {
    
    /** Jméno tohoto programu. */
    public static final String NAME = "k3bookgen";
    /** Zkrácené jméno tohoto programu. */
    public static final String NAME_SHORT = "k3bg";

    /**
     * URL, domovské stránky programu.
     */
    public static final String HOMEPAGE_URL =
            "http://code.google.com/p/k3bookgen";

    /** Jméno licence programu */
    public static final String LICENCE_NAME = "MIT (X11)";
            
    /** */
    public static final boolean OS_IS_LINUX =
            System.getProperty("os.name").toLowerCase().contains("linux");

    /** */
    public static final boolean OS_IS_WINDOWS =
            System.getProperty("os.name").toLowerCase().contains("windows");
    
    /** Výchozí kódování konce řádku. */
    public static final String EOL =
            System.getProperty("line.separator");            
    
    /** Výchozí kódování znaků textových souborů. */
    public static final String DEFAULT_CHARSET =
            System.getProperty("file.encoding");
    
    /** Preferované kódování znaků; je <tt>{@value }</tt>. */
    public static final String PREFERRED_CHARSET = "UTF-8";

    /** Kódování znaků na konzoli. (Ve Windows je jiné než výchozí kódování) */
    public static final String CONSOLE_DEFAULT_CHARSET =
            ConsoleCharset.getName();
    
    /** */
    public static final String HOME_DIR = 
            System.getProperty("user.home");
            
    /** */
    public static final String JRE_VERSION = 
            System.getProperty("java.version");
    
    /** */
    public static final String JVM_VENDOR = 
            System.getProperty("java.vm.vendor");
    
    /**
     * Označení verze tohoto programu.
     * (Např. 0.1 (2011-12-31))
     */
    public static final String VERSION_FULL_NAME;
    static {
        Version v = new Version(Application.class.getPackage());
        VERSION_FULL_NAME = v.toString();
    }
    
    /**
     * Číslo verze programu. Klasické značení.
     * Nemělo by obsahovat jiné znaky než '.' a číslice
     * (Např. 0.1)
     */
    public static final String VERSION_NUMBER;
    static {
        Version v = new Version(Application.class.getPackage());
        VERSION_NUMBER = v.getSpecificationVersion();
    }
    
    /**
     * Adresář pro konfiguraci a pod.
     * 
     * <tt>{@value }</tt>
     */
    public static final String CFG_DIR = 
//            ".";
            HOME_DIR + File.separator + "." + NAME_SHORT;
    static {
        new File(CFG_DIR).mkdirs();
    }

    /**
     * Výchozí cesta k souboru se záznamem činnosti.
     * 
     * <tt>{@value }</tt>
     */
    public static final String DEFAULT_LOG_FILE_NAME = 
            CFG_DIR + File.separator + NAME_SHORT + ".log";
    
    
    // -----

    
    /** */
    private Application() {        
    }
    
    // -----

    private static final boolean DEBUG = false;
    @SuppressWarnings("NonConstantLogger")
    private static Logger logger;
//          LoggerManager.getLogger(Application.class, DEBUG);

    private static final boolean DEFAULT_DEBUG_ALL = false;
    /** */
    private static boolean globalDebug = DEFAULT_DEBUG_ALL;
    
    /**
     * Odložená inicializace loggeru, kvůli tomu, že 
     * LoggerManager používá konstatnty z této třídy...
     * Hack.
     * Volat před použitím loggeru(!).
     */
    private static void initLogger() {
        if (logger == null) {
            logger = LoggerManager.getLogger(Application.class, DEBUG);
        }
    }
    
    /**
     * 
     */
    public static boolean isDebug() {
        return globalDebug;
    }
    
    /**
     * 
     */
    public static void setDebug(boolean debug) {        
        Application.globalDebug = debug;
        
        initLogger();   // (! nutné před zalogováním)
        logger.config(" debug mode = " + debug);
    }    

    
    /**
     * 
     */
    public static void logConfigInfo() {
        
        initLogger();   // (! nutné před zalogováním)
        logger.info(" version: " + 
                new Version(Application.class.getPackage()).toString());
        logger.config(" log levels : " + DetailFormatter.getLegend());
        logger.config(" log filename = " + LoggerManager.getLogFileName());
        logger.config(" debug mode = " + isDebug());
        logger.config(" default file encoding = " + DEFAULT_CHARSET);
        
        try {
            if (! Charset.forName(CONSOLE_DEFAULT_CHARSET)
                    .equals(Charset.forName(DEFAULT_CHARSET))) {
                logger.config(" default console encoding = " 
                        + CONSOLE_DEFAULT_CHARSET);
            }
        } catch (IllegalCharsetNameException ex) {
            logger.warning(ex.getMessage());
        } catch (UnsupportedCharsetException ex) {
            logger.warning(ex.getMessage());
        }
        
        logger.config(" default locale = " + Locale.getDefault());      
    }    
    
}   // Application
